package com.cy.pj.common.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect//描述定义一个切面对象
@Component
public class SysLogAspect {
    /*切入点定义
    * 1）使用@Pointcut注解进行切入点描述
    * 2）使用bean表达式定义切入点，语法bean（spring容器中管理的某个bean的名字）
    * bean表达式是一种粗粒度的切入点表达式（不能具体到bean中哪个方法）
    */
    //@Pointcut("bean(categoryServiceImpl)")//定义一个切入点
    @Pointcut("bean(*ServiceImpl)")//定义一个切入点
    public void doLog(){}

    /*在切入点对应的目标方法执行时，要进行的动作以如下方式定义
    * @param joinPoint 封装切入集合方法中的某个正在执行的目标方法
    * @return 为目标方法的返回结果
    * */
    @Around("doLog()")
    public Object doAround(ProceedingJoinPoint joinPoint)throws Throwable{
        long t1=System.currentTimeMillis();
        Object result=joinPoint.proceed();
        long t2=System.currentTimeMillis();
        System.out.println("execute time {}"+(t2-t1));
        return result;//目标方法的执行结果
    }
}
